import org.checkerframework.checker.units.qual.A;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.*;

import com.sun.org.apache.xpath.internal.operations.Or;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;

import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

import static java.lang.Thread.sleep;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class) //注解说明当前类下所有的用例需要使用 Order,自定义排序
public class BlogCases extends InitAndEnd{

    public static Stream<Arguments> Generator() {//动态传递参数
        return Stream.of(Arguments.arguments("http://42.192.83.143:8563/blog_system/blog_detail.html", "博客详情页",
                "自动化测试"));
    }

    /**
     * 输入正确的账号密码,点击确认按钮后登录成功进入到个人列表页
     * @param username
     * @param password
     * @param blog_list_url
     * @throws InterruptedException
     */
    @Order(1)//首先执行测试
    @ParameterizedTest//声明当前测试方法为参数化方法
    @CsvSource("yl,123,http://47.120.35.226:8080/myblog_list.html")//参数传递
     void LoginSuccess(String username,String password,String blog_list_url) throws InterruptedException {
         //打开博客登录页面
         webDriver.get("http://47.120.35.226:8080/login.html");
         webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//添加智能等待,要不然的话有些元素加载不出来的话,就过去了
         //输入账号yl
         webDriver.findElement(By.cssSelector("#username")).sendKeys(username);//参数的姓名
         //输入密码123
         webDriver.findElement(By.cssSelector("#password")).sendKeys(password);//参数的密码
         //点击提交登录按钮
         sleep(1000);
         webDriver.findElement(By.cssSelector("#submit")).click();
         //这里登录成功后还有一个登录成功的弹窗,我们得点击确定,才会跳转
         sleep(1000);//这里一定要加延时,因为项下面的弹窗代码,马上执行的话会获取不到弹窗的(因为还没有弹出来
         webDriver.switchTo().alert().accept();
         webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//智能等待
         //现在已经登录成功跳转到登录页面了,
         //获取到当前页面的url
         String cur_url=webDriver.getCurrentUrl();
         Assertions.assertEquals(blog_list_url,cur_url);//断言,当预期的url等于获取到的url的时候,测试才通过
     }
    /**
     * 博客列表页博客数量不为0(因为我们登录了吗,就跳转到了个人博客列表页了
     */
    @Order(2)
    @Test
    void BlogList(){
        //打开博客列表页
        webDriver.get("http://47.120.35.226:8080/myblog_list.html");//这时候打开有session了,可以打开
        //获取页面上所有的博客标题对应的元素
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//先智能等待
        int title_num=webDriver.findElements(By.cssSelector(".title")).size();//获取多个类叫title的控件,标签统计数量
        Assertions.assertNotEquals(0,title_num);//断言(取反的)
    }
    /**
     *
     * 写博客
     */
    @Order(3)
    @Test
    void EditBlog() throws InterruptedException{
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();//找到写博客按钮,并且点击
        //通过js的方式进行输入(输入标题:自动化测试)
        ((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value=\"自动化测试\"");
         sleep(2000);
        //点击发布按钮
        webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();//点击
        sleep(2000);
        //点击发布后会有提示弹窗
        webDriver.switchTo().alert().dismiss();//点击取消再次发布的按钮(不再 继续发布了)
        //跳转到了个人博客列表页,验证是否成功发布
        String url= webDriver.getCurrentUrl();//获取当前页面的url
        Assertions.assertEquals("http://47.120.35.226:8080/myblog_list.html",url);//断言,预期url等于现实的url的时候才成功


    }

    /**因为我们上面写了博客,点击不添加后会自动跳转到博客列表页,我们看看刚刚写的博客有没有添加
     * 博客详情页校验
     * url
     * 博客标题
     * 页面title是“博客详情页”
     */
    @Order(4)
    @ParameterizedTest
    @MethodSource("Generator")
    void BlogDetail(){
        //找到第一篇博客的查看全文,然后点击,进入到博客详情页(因为我们上面刚刚写的博客后,就在第一页)
        webDriver.findElement(By.xpath("//*[@id=\"artListDiv\"]/div[1]/a[1]")).click();
        //跳转到了博客详情页
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//智能等待
        //获取页面的url
        String cur_url=webDriver.getCurrentUrl();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //获取当前页面的title
        String cur_title=webDriver.getTitle();//这个title是head里面的title(博客正文)
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        //获取博客标题
        String blog_title=webDriver.findElement(By.cssSelector("#title")).getText();//获取标题控件对应的文本
        System.out.println(blog_title+"haahh");
        System.out.println(cur_title);
        System.out.println(cur_url);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
       /* //下面就是验证了
        Assertions.assertEquals("自动化测试",blog_title);//验证博客的标题
        Assertions.assertEquals("http://47.120.35.226:8080/blog_content.html?aid=11",cur_url);//验证博客详情页的url
        Assertions.assertEquals("博客正文",blog_title);//验证博客详情页的titl*/
    }

    /**
     * 校验已发布博客标题
     * 校验已发布博客时间
     */
    @Order(5)
    @Test
    void BlogInfoChecked(){
        webDriver.get("http://47.120.35.226:8080/myblog_list.html");//到达个人博客列表页
        //获取第一篇博客的标题
        String blog_title=webDriver.findElement(By.cssSelector("#artListDiv > div > div.title")).getText();//获取标题的文本
        //检验博客标题是否是自动化测试
        Assertions.assertEquals("自动化测试",blog_title);
    }
    /**
     *x测试添加了数据,那么我们就要把数据去除,不能污染环境
     * 删除和刚才发布的博客
     */
    @Order(6)
    @Test
    void DeleteBlog() throws InterruptedException {
        //打开博客列表页
        webDriver.get("http://47.120.35.226:8080/myblog_list.html");
        //点击删除按钮
        webDriver.findElement(By.cssSelector("#artListDiv > div > a:nth-child(6)")).click();
        //因为删除成功有显示弹窗,所以得获取弹窗
        sleep(1000);//这里一定要加延时,因为项下面的弹窗代码,马上执行的话会获取不到弹窗的(因为还没有弹出来
        webDriver.switchTo().alert().accept();//点击确定的弹窗按钮
        //因为我们写的测试的博客已经被删除了,现在检验一下 有没有真的被删除,所以获取第一篇博客的标题,看等不等于自动化测试
        String blog_title=webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText();
        Assertions.assertNotEquals("自动化测试",blog_title);//只有当预期值不等于实际值的时候才会通过
    }
    /**
     * 注销
     */
    @Order(7)
    @Test
    void Logout(){
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();//点击注销按钮
        //会有弹窗,得处理,点击弹窗的确定按钮
        webDriver.switchTo().alert().accept();
        //注销后跳转到了登录页面,验证是否真的在登录页面
        String url= webDriver.getCurrentUrl();
        Assertions.assertEquals("http://47.120.35.226:8080/login.html",url);
    }
}
